package code16_反射;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.Map;

/**
 * @author 黄衡熙
 * @version 1.0
 */
public class EmpFactoryMap {
    private static Map<String, String> map;

    static {
        map = new HashMap<>();
        try {
            BufferedReader br = new BufferedReader(
                    new InputStreamReader(
                            EmpFactoryMap.class
                                    .getClassLoader()
                                    .getResourceAsStream("emp.properties")));
            String line = null;
            while ((line = br.readLine()) != null) {
                String[] arr = line.split("=");
                map.put(arr[0], arr[1]);
            }
//            System.out.println(map);
        } catch (Exception e) {
            e.printStackTrace();
            throw new ExceptionInInitializerError("文件解析失败");
        }
    }

    public static Emp getEmp() {
        try {
            // 通过反射创建一个Emp对象
            Class<Emp> c = Emp.class;
            // 调用无参构造方法创建对象
            Emp emp = c.newInstance();
            // 获取当前对象中所有的属性
            Field[] fields = c.getDeclaredFields();
            for (Field field : fields) {
                System.out.println(field);
                Class typeClass = field.getType();
                // 每一个属性上都有一个@Value的注解
                // 获取对应注解信息
                Value annotation = field.getAnnotation(Value.class);
                // 该注解是通过解析properties文件获取到的集合中key与当前注解的value属性值一致的数据
                // 将文件中解析出来的value值赋值给当前的属性
                // 将注解中的数据作为key
                String key = annotation.value();
                // 根据key去解析后的properties集合中找到对应的value
                String value = map.get(key);
                // 将value的值赋值给当前属性
                // 由于当前属性是private封装,需要取消权限控制检查
                field.setAccessible(true);
                // 为属性赋值
                if (typeClass == Integer.class) {
                    field.set(emp, Integer.parseInt(value));
                } else if (typeClass == Double.class) {
                    field.set(emp, Double.parseDouble(value));
                } else {
                    field.set(emp, value);
                }
            }
            return emp;
        } catch (InstantiationException e) {
            throw new RuntimeException("没有找到对应的无参构造方法");
        } catch (IllegalAccessException e) {
            throw new RuntimeException("非法访问异常");
        }
    }
}
